import { insertCart, findCartList, deleteCart, updateCart, checkAllCart } from '@/api/cart.js'

const cart = {
  namespaced: true,
  state: () => ({
    cartList: []
  }),
  getters: {
    // 总价 -- 把cartList中所有的price*count累加
    totalPrice (state) {
      return state.cartList.reduce((a, c) => { return a + c.price * c.count }, 0)
    },
    // 总数量 -- 把cartList中所有的count累加
    totalCount (state) {
      return state.cartList.reduce((a, c) => { return a + c.count }, 0)
    },
    // 已选择
    selectedCount (state) {
      // 筛选
      return state.cartList
        .filter(item => item.selected === true)
        .reduce((a, c) => a + c.count, 0)
    },
    // 已选择商品的总价
    selectedPrice (state) {
      return state.cartList
        .filter(item => item.selected === true)
        .reduce((a, c) => a + c.count * c.price, 0)
    },
    // 全/反选
    isAll (state) {
      // cartList中的所有项 selected为true isAll才等于true
      return state.cartList.every(item => item.selected === true)
    }
  },
  mutations: {
    setCartList (state, cartList) {
      state.cartList = cartList
    }
  },
  actions: {
    // 添加购物车
    async addCart (ctx, { skuId, count }) {
      // 1.加入购物车接口
      await insertCart({ skuId, count })
      // 2.获取最新购物车列表
      const res = await findCartList()
      // 3.将获取到的数据存入state
      ctx.commit('setCartList', res.result)
    },
    // 删除购物车
    async delCart (ctx, ids) {
      // 1.删除购物车接口
      await deleteCart(ids)
      // 2.获取最新购物车列表
      const res = await findCartList()
      // 3.将获取到的数据存入state
      ctx.commit('setCartList', res.result)
    },
    // 单选购物车
    async singleCart (ctx, goods) {
      // 1.调用单选接口
      await updateCart(goods)
      // 2.获取最新购物车列表
      const res = await findCartList()
      // 3.将获取到的数据存入state
      ctx.commit('setCartList', res.result)
    },
    // 全选/反选
    async allCheckCart (ctx, selected) {
      // 1.全选接口
      await checkAllCart({
        selected,
        ids: ctx.state.cartList.map(item => item.skuId)
      })
      // 2.获取最新购物车列表
      const res = await findCartList()
      // 3.将获取到的数据存入state
      ctx.commit('setCartList', res.result)
    }
  }
}

export default cart
